package Class026;

import java.util.Objects;
import java.util.TreeMap;
import java.util.TreeSet;

public class TreeSetAndTreeMap {
    public static void main(String[] args) {
        //底层是红黑树

        TreeMap<Integer, String> tmap = new TreeMap<>();
        tmap.put(5, "这是5");
        tmap.put(3, "这是3");
        tmap.put(1, "这是1");
        tmap.put(7, "这是5");
        tmap.put(10, "这是5");
        tmap.put(9, "这是5");

        System.out.println(tmap.firstKey());
        System.out.println(tmap.lastKey());
        System.out.println(tmap.floorKey(4)); //所有的key <= 4 最近的key
        System.out.println(tmap.ceilingKey(4)); //>= 4 最近的key
        //为何hashmap这么废物还要用?
        //因为增删改查在有序表都是O(logN), 一棵树的调整
        //hash是O(1)
        //比较器比较熟悉，不写了，也可以lambda表达式

        //对于自己定义的对象，必须告诉有序表，排序规则是什么
        //注意toString()默认是
        //return getClass().getName() + "@" + Integer.toHexString(hashCode());
        //所以和hashCode密切相关，可以理解为对象的地址。
        //如果不当地重写了hashCode，也会导致去重出现
        TreeSet<Student> testSet = new TreeSet<>((s1, s2) ->
            !s1.name.equals(s2.name) ? s1.name.compareTo(s2.name) :
                    s1.age != s2.age ? s1.age - s2.age :
                            s1.toString().compareTo(s2.toString())
        );

        Student s1 = new Student(10, "张三");
        Student s2 = new Student(10, "张三");
        testSet.add(s1);
        testSet.add(s2);
        System.out.println("set大小:" + testSet.size());
    }

    public static class Student {
        public int age;
        public String name;

        public Student(int age, String name) {
            this.age = age;
            this.name = name;
        }
    }
}
